package local

import (
	"fmt"
	"time"
)

/* ------
	主要函数:
		StrTotime
		TimeToStr
		TimeStrAdd
------ */

// LenYear 年时间字符串长度
const LenYear int = 4

// LenMonth 月时间字符串长度
const LenMonth int = 7

// LenDay 天时间字符串长度
const LenDay int = 10

// LenSec 秒时间字符串长度
const LenSec int = 19

// FormatDay 精确到日的时间格式
const FormatDay string = "2006-01-02"

// FormatSec 精确到秒的时间格式
const FormatSec string = "2006-01-02 15:04:05"

// GetTimeNow 获取 UTC+8 北京时间。 isDay 精确到天, 否则精确到秒
func GetTimeNow() time.Time {
	return time.Now().UTC().Add(8 * time.Hour)
}

// GetTimeStr 获取 UTC+8 北京时间。 isDay 精确到天, 否则精确到秒
func GetTimeStr(isDay bool) string {
	now := time.Now().UTC().Add(8 * time.Hour)
	if isDay {
		return now.Format(FormatDay)
	}
	return now.Format(FormatSec)
}

// GetDateStr 获取 yyyy-MM-dd 格式的字符串。默认或格式错误会返回当前时间
func GetDateStr(str string) string {
	t, err := StrToTime(str)
	if err != nil {
		return GetTimeStr(true)
	}
	return t.Format(FormatDay)
}

// GetDatetimeStr 获取 yyyy-MM-dd HH:MM:SS 格式的字符串。默认或格式错误会返回当前时间
func GetDatetimeStr(str string) string {
	t, err := StrToTime(str)
	if err != nil {
		return GetTimeStr(false)
	}
	return t.Format(FormatSec)
}

// StrToTime "yyyy" 到 "yyyy-MM-dd HH:MM:SS"(多余会剔除) 字符串转时间 time.Time。
func StrToTime(timeStr string) (time.Time, error) {
	var err error
	var t time.Time
	if len(timeStr) >= LenSec {
		timeStr = timeStr[:LenSec]
		t, err = time.Parse("2006-01-02 15:04:05", timeStr)
		if err != nil {
			// TS 发送时间格式是这样的(兼容一下)
			t, err = time.Parse("2006-01-02T15:04:05", timeStr)
		}
	} else if len(timeStr) >= LenDay {
		timeStr = timeStr[:LenDay]
		t, err = time.Parse("2006-01-02", timeStr)
	} else if len(timeStr) >= LenMonth {
		timeStr = timeStr[:LenMonth]
		t, err = time.Parse("2006-01", timeStr)
	} else if len(timeStr) >= LenYear {
		timeStr = timeStr[:LenYear]
		t, err = time.Parse("2006", timeStr)
	} else {
		err = fmt.Errorf("StrToTime: invalid str : %s", timeStr)
	}
	if err != nil {
		err = fmt.Errorf("StrToTime: error : %s", err.Error())
	}
	return t, err
}

// TimeToStr 时间转字符串。 2006-01-01 或 2006-01-02 15:04:05 两种
func TimeToStr(t time.Time, isDay bool) string {
	if isDay {
		return t.Format(FormatDay)
	}
	return t.Format(FormatSec)
}

// TimeStrAdd ("2020-01-01 00:00:01", time.Hour) 时间加减 -time.Hour。默认或格式错误会返回当前时间
func TimeStrAdd(timeStr string, dur time.Duration) string {
	t, err := StrToTime(timeStr)
	if err != nil {
		return GetTimeStr(len(timeStr) != LenSec)
	}
	t = t.Add(dur)
	return TimeToStr(t, len(timeStr) != LenSec)
}
